/**
 * @author zj
 * @date 2024/08/22
 */

import {Component, VNodeChild} from 'vue';
import {RelationHandler} from './handler.ts';

/**
 * 数据信息类型
 */
export type DataInfo = {
  // 是否加载中
  loading?: boolean,
  // 是否禁止
  disabled?: boolean,
  // 是否只读
  readonly?: boolean,
  // 其他动态属性，根据不同组件有不同的属性
  [key: string]: any
}

/**
 * 渲染函数
 */
export type ChildRender = (props: ChildProps, data: any, info: DataInfo) => VNodeChild;

/**
 * 扩展属性
 */
export type ExtendKey = {
  prop: string,
  name: string,
  update?: string
};

/**
 * 数据节点节点属性
 */
export type ChildData = {
  // 数据节点处理的数据中的属性名称
  prop?: string,
  // 数据节点的数据类型
  datatype?: string,
  // 数据节点的默认值
  defaultValue?: any,
  // 数据节点的数据名称
  valueKey?: string,
  // 数据节点的更新方法名称
  updateKey?: string,
  // 数据节点扩展数据传入
  extendKeys?: ExtendKey[]
}

/**
 * 基础节点属性
 */
export type ChildBasic = {
  // 节点对应父节点插槽名称，默认default
  name?: string,
  // 设置加载key
  loadingKey?: string,
  // 设置禁止key
  disabledKey?: string,
  // 自定义渲染函数
  render?: ChildRender
};

/**
 * 描述一个树形结构中的节点属性
 */
export type ChildProps = { [P in keyof ChildBasic]: ChildBasic[P] } & { [T in keyof ChildData]: ChildData[T] } & {
  // 节点的key
  key: string | number,
  // 显示文本
  text?: string,
  // html标签名称
  tagName?: string,
  // 描述节点的类型
  type?: string,
  // 描述节点的组件
  component?: Component,
  // 节点的自定义属性
  props: Record<string, any>,
  // 子节点
  children: ChildProps[]
};

/**
 * 规则节点
 */
export type ItemRule = {
  // 节点的显示文本
  label?: string,
  // 是否使用FormItem
  formItem?: boolean,
  // 文本输入的最小长度，这里是添加到规则中，如果不设置，则不会添加规则
  minlength?: number,
  // 文本输入的最大长度，这里是添加到规则中，如果不设置，则不会添加规则
  maxlength?: number,
  // 长度提示信息，可以使用 {min} 和 {max} 代替最小和最大长度
  lengthMessage?: string,
  // 正则表达式，这里是添加到规则中，如果不设置，则不会添加规则
  regex?: string,
  // 正则表达式提示信息
  regexMessage?: string,
  // 自动生成必填规则，如果不设置，则不会添加规则
  required?: boolean,
  // 必填提示信息，如果不设置，默认使用 placeholder 属性
  requiredMessage?: string,
  // FormItem的规则
  rules?: Record<string, any>[]
}

/**
 * 配置的属性
 */
export type ItemAttrs =
  { [P in keyof ChildBasic]: ChildBasic[P] }
  & { [T in keyof ChildData]: ChildData[T] }
  & { [R in keyof ItemRule]: ItemRule[R] }
  & {
  // 节点的类型
  type?: string | Component,
  // 自定义处理器，只有在type=Component或者type===null使用
  handler?: string,
  // 节点的自定义属性
  props?: Record<string, any>,
  // 占位符
  placeholder?: string,
  // 子节点
  children?: ItemAttrs[],
  // 其他动态属性，根据不同组件有不同的属性
  [key: string]: any
};

/**
 * 解析结果
 */
export type ResolveData = {
  children: ChildProps[],
  bindKeys: BindKeyInfo[],
}

/**
 * 绑定的key信息
 */
export type BindKeyInfo = {
  keyName: string,
  defaultValue?: any,
  datatype?: string
}

/**
 * 上级传递信息
 */
export type ParentInfo = {
  // grid 行的列数
  rowspan?: number,
  // grid 列的列数
  colspan?: number,
  // 布局尺寸
  size?: string
}

/**
 * 上级传递信息
 */
export type ParentData = { [P in keyof ParentInfo]: ParentInfo[P] } & {
  // 描述子节点的类型
  childType?: string,
  // 父节点
  parent?: ParentInfo,
  // 父节点的属性
  props?: ChildProps
}

/**
 * 处理下级数据
 */
export type ChildWrapperData = {
  childProps: ChildProps,
  parentData: ParentData,
}

/**
 * 处理相关数据
 */
export type RelationWrapperData = { [P in keyof ChildWrapperData]: ChildWrapperData[P] } & {
  relationHandler: RelationHandler
};

/**
 * 处理结果数据
 */
export type HandleData = {
  topChildProps?: ChildProps,
  topParentData?: ParentData,
  nextChildProps?: ChildProps,
  nextParentData?: ParentData
}

